home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Converter.C < prev    next >
C/C++ Source or Header  |  1992-06-29  |  5KB  |  247 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Converter.h"
  6.  
  7. #include "Class.h"
  8. #include "String.h"
  9. #include "Data.h"
  10. #include "CLib.h"
  11. #include "OrdColl.h"
  12. #include "ClassManager.h"
  13.  
  14. #include "CollView.h"
  15. #include "TextItem.h"
  16. #include "BorderItems.h"
  17. #include "Box.h"
  18. #include "Scroller.h"
  19. #include "Expander.h"
  20. #include "Dialog.h"
  21. #include "Buttons.h"
  22.  
  23. //---- ConverterDialog ---------------------------------------------------------
  24.  
  25. class ConverterDialog : public Dialog {
  26. public:
  27.     MetaDef(ConverterDialog);
  28.     ConverterDialog();
  29.     ~ConverterDialog();
  30.     Converter *ShowInWindow(SeqCollection *list);
  31.     VObject *DoMakeContent();
  32.     void DoSetup();
  33.     void Control(int id, int p, void *v);
  34. private:
  35.     CollectionView *collView;
  36.     SeqCollection *converterList;
  37. };
  38.         
  39. NewMetaImpl0(ConverterDialog,Dialog);
  40.  
  41. ConverterDialog::ConverterDialog() : Dialog("Converter")
  42. {
  43. }
  44.  
  45. ConverterDialog::~ConverterDialog()
  46. {
  47.     SafeDelete(collView);
  48. }
  49.  
  50. Converter *ConverterDialog::ShowInWindow(SeqCollection *list)
  51. {
  52.     converterList= list;
  53.     
  54.     OrdCollection *col= new OrdCollection;
  55.     Iter next(converterList);
  56.     Converter *cv;
  57.     
  58.     while (cv= (Converter*) next())
  59.     col->Add(new TextItem(cv->AsString()));
  60.     
  61.     collView= new CollectionView(this, col, eCVDontStuckToBorder);
  62.     collView->SetMinExtent(Point(100, 0));
  63.     
  64.     Port *old= GrGetPort();
  65.     Dialog::Show();
  66.     if (old)
  67.     GrSetPort(old);
  68.  
  69.     Rectangle r= collView->GetSelection();
  70.     if (r.IsNotEmpty())
  71.     return (Converter*) converterList->At(r.origin.y);
  72.     return 0;
  73. }
  74.  
  75. VObject *ConverterDialog::DoMakeContent()
  76. {
  77.     return
  78.     new Matte(
  79.         new Expander(cIdNone, eVert, 20,
  80.         new Scroller(collView, Point(150, cAutoSize)),
  81.         new HBox(10, (VObjAlign)(eVObjVBase|eVObjHEqual|eVObjHExpand),
  82.             new ActionButton(cIdOk, "Convert", TRUE),
  83.             new ActionButton(cIdCancel, "Cancel"),
  84.             0
  85.         ),
  86.         0
  87.         )
  88.     );
  89. }
  90.  
  91. void ConverterDialog::DoSetup()
  92. {
  93.     EnableItem(cIdOk, !collView->GetSelection().IsEmpty());
  94. }
  95.  
  96. void ConverterDialog::Control(int id, int p, void *v)
  97. {
  98.     if (p == cPartCollDoubleSelect) {
  99.     Dialog::Control(cIdOk, cPartAction, v);
  100.     } else
  101.     Dialog::Control(id, p, v);
  102. }
  103.  
  104. //---- Converter ---------------------------------------------------------------
  105.  
  106. ONEXIT(Converter)
  107. {
  108.     Converter::CleanUp();
  109. }
  110.  
  111. NewMetaImpl(Converter,Object, (TP(filters)));
  112.  
  113. OrdCollection *Converter::filters;
  114.  
  115. Converter::Converter()
  116. {
  117. }
  118.  
  119. void Converter::CleanUp()
  120. {
  121.     if (filters) {
  122.     filters->FreeAll();
  123.     SafeDelete(filters);
  124.     }
  125. }
  126.  
  127. Converter *Converter::SelectConverter(OrdCollection *list)
  128. {
  129.     Converter *cv= 0;
  130.     if (list->Size() > 1) {
  131.     ConverterDialog *dia= new ConverterDialog;
  132.     cv= dia->ShowInWindow(list);
  133.     gSystem->AddCleanupObject(dia);
  134.     } else if (list->Size() == 1)
  135.     cv= (Converter*) list->At(0);
  136.     return cv;
  137. }
  138.  
  139. Converter *Converter::FindConverter(Data *data, Class *want, OrdCollection *l)
  140. {
  141.     if (filters == 0) {
  142.     Iter next(gClassManager->Iterator());
  143.     Class *cla;
  144.     
  145.     filters= new OrdCollection;
  146.     while (cla= (Class*)next())
  147.         if (cla->isKindOf(Meta(Converter)))
  148.         filters->Add(cla->Proto()->New());
  149.     }
  150.     
  151.     Iter next(filters);
  152.     register Converter *filter;
  153.     
  154.     while (filter= (Converter*) next())
  155.     if (filter->CanConvert(data, want)) {
  156.         if (gDebug)
  157.         fprintf(stderr, "Converter::FindConverter: %s\n", filter->AsString());
  158.         if (l == 0)
  159.         return filter;
  160.         if (l->FindPtr(filter) == 0)
  161.         l->Add(filter);
  162.     }
  163.     if (l && l->Size() > 0)
  164.     return (Converter*)l->At(0);
  165.     if (gDebug)
  166.     fprintf(stderr, "Converter::FindConverter: no filter found\n");
  167.     return 0;
  168. }
  169.  
  170. bool Converter::CanConvert(Data*, Class*)
  171. {
  172.     return FALSE;
  173. }
  174.  
  175. Object *Converter::Convert(Data*, Class*)
  176. {
  177.     return 0;
  178. }
  179.  
  180. Object *Converter::AsObject(Data *data, Class *want)
  181. {
  182.     return Convert(data, want);
  183. }
  184.  
  185. //---- OIOConverter ------------------------------------------------------------
  186.  
  187. class OIOConverter : public Converter {
  188. public:
  189.     MetaDef(OIOConverter);
  190.     OIOConverter() : Converter()
  191.     { }
  192.     char *AsString()
  193.     { return "ET++ Object Input/Output"; }
  194.     Object *Convert(Data *data, Class *want);
  195.     bool CanConvert(Data *data, Class *want);
  196. };
  197.  
  198. NewMetaImpl0(OIOConverter, Converter);
  199.  
  200. bool OIOConverter::CanConvert(Data *data, Class *want)
  201. {
  202.     if (!data->IsETFormat())
  203.     return FALSE;
  204.     if (gDebug)
  205.     fprintf(stderr, "OIOConverter::CanConvert: is:%s want:%s\n",
  206.                     data->Type().AsString(), want->Name());
  207.     if (data->GetClassType() == 0) {
  208.     if (data->Type() == Symbol(want->Name()))
  209.         return TRUE;
  210.     if (data->IsETFormat()) {
  211.         Object *op= Convert(data, want);
  212.         if (op == 0)
  213.         return FALSE;
  214.         SafeDelete(op);
  215.         return TRUE;
  216.     }
  217.     return FALSE;
  218.     }
  219.     //fprintf(stderr, "%s\n", data->GetClassType()->Name());
  220.     //if (!data->IsETFormat())
  221.     //    return FALSE;
  222.     //fprintf(stderr, "oops\n");
  223.     return data->GetClassType()->isKindOf(want);
  224. }
  225.  
  226. Object *OIOConverter::Convert(Data *data, Class *want)
  227. {
  228.     char c;
  229.     IStream ois(data->GetStreamBufForReading(), 0, TRUE);
  230.     Object *op= 0;
  231.     
  232.     ois.get(c);
  233.     if (c == '@') {
  234.     while (ois.get(c))
  235.         if (c == '\n')
  236.         break;
  237.     } else
  238.     ois.putback(c);
  239.     
  240.     ois >> op;
  241.     if (op && op->IsA()->isKindOf(want))
  242.     return op;
  243.     SafeDelete(op);
  244.     return 0;
  245. }
  246.  
  247.